package cn.zwx.business.order.mq.producer;

import cn.zwx.business.order.constants.CommonConstant;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @description: 普通消息生产者
 * @projectName:rocket-mq-example
 * @see:cn.zwx.business.order.mq.producer
 * @author:zhangwenxue
 * @createTime:2020/10/17 9:15
 * @version:1.0
 */
@Component
public class DefaultProducer {

    private static final Logger logger =  LoggerFactory.getLogger(DefaultProducer.class);


    /**
     * 这里的生产者和之前的不一样
     */
    private DefaultMQProducer producer = null;


    public DefaultProducer() throws MQClientException {
        /**
         * 一个应用创建一个Producer，由应用来维护此对象，可以设置为全局对象或者单例<br>
         * 注意：ProducerGroupName需要由应用来保证唯一<br>
         * ProducerGroup这个概念发送普通的消息时，作用不大，但是发送分布式事务消息时，比较关键，
         * 因为服务器会回查这个Group下的任意一个Producer
         */
        producer = new DefaultMQProducer(CommonConstant.APPLICATION_NAME);
        producer.setNamesrvAddr(CommonConstant.NAME_SERVER);
        producer.setInstanceName(DefaultProducer.class.getName());
        producer.setVipChannelEnabled(false);

        /**
         * Producer对象在使用之前必须要调用start初始化，初始化一次即可<br>
         * 注意：切记不可以在每次发送消息时，都调用start方法
         */
        this.start();
        logger.info("RocketMq defaultProducer Started.");
    }

    public DefaultMQProducer getProducer() {
        return this.producer;
    }

    /**
     * 对象在使用之前必须要调用一次，只能初始化一次
     */
    public void start() {
        try {
            this.producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }
}
